/**
 * Licensed to Apereo under one or more contributor license agreements. See the NOTICE file
 * distributed with this work for additional information regarding copyright ownership. Apereo
 * licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use
 * this file except in compliance with the License. You may obtain a copy of the License at the
 * following location:
 *
 * <p>http://www.apache.org/licenses/LICENSE-2.0
 *
 * <p>Unless required by applicable law or agreed to in writing, software distributed under the
 * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
 * express or implied. See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apereo.portal.tenants;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * This class encapsulates the different items of information that a concrete {@link
 * ITenantOperationsListener} might want to communicate back to the service about the process. These
 * include whether the operation succeeded, whether to abort the operation (if not), a handler for
 * callbacks for commit/rollback support, and information to display in the summary report.
 *
 * @since 4.3
 */
public class TenantOperationResponse {

    public enum Result {

        /** Indicates the {@link ITenantOperationsListener} was successful. */
        SUCCESS,

        /**
         * Indicates the {@link ITenantOperationsListener} was not successful, but stops short of
         * canceling the whole operation.
         */
        FAIL,

        /**
         * Indicates the {@link ITenantOperationsListener} was not successful and that the operation
         * should be cancelled and, if possible, rolled back.
         */
        ABORT,

        /** Instructs the {@link TenantService} to keep this response out of the report. */
        IGNORE
    }

    // Instance Members
    private final ITenantOperationsListener listener;
    private final Result result;
    private final List<String> messages = new ArrayList<>();

    public TenantOperationResponse(ITenantOperationsListener listener, Result result) {
        this.listener = listener;
        this.result = result;
    }

    public ITenantOperationsListener getTenantOperationsListener() {
        return listener;
    }

    public Result getResult() {
        return result;
    }

    public void addMessage(String message) {
        messages.add(message);
    }

    public List<String> getMessages() {
        return Collections.unmodifiableList(messages);
    }
}
